#!/usr/bin/env node

// 详细的电调校准脚本
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);

console.log("🔧 详细的电调校准脚本");
console.log("⚠️  警告: 校准过程中电调会发出蜂鸣声，请确保螺旋桨已移除!");

async function runCommand(command) {
  try {
    const result = await execAsync(command);
    return { success: true, stdout: result.stdout.trim(), stderr: result.stderr.trim() };
  } catch (error) {
    return { success: false, error: error.message, stdout: '', stderr: error.stderr || '' };
  }
}

async function calibrateESC() {
  console.log("\n🔍 开始电调校准程序...");
  
  // 1. 初始化引脚
  console.log("1. 初始化引脚13:");
  try {
    await execAsync('gpio -g mode 13 out');
    console.log("   ✅ 引脚13设置为输出模式");
  } catch (error) {
    console.log(`   ❌ 设置失败: ${error.message}`);
    return false;
  }
  
  // 2. 校准步骤说明
  console.log("\n📋 电调校准步骤:");
  console.log("   步骤1: 发送最大油门信号 (2.0ms高电平)");
  console.log("   步骤2: 发送最小油门信号 (1.0ms高电平)");
  console.log("   步骤3: 发送中性信号 (1.5ms高电平)");
  
  // 3. 等待用户准备
  console.log("\n⏳ 请确保:");
  console.log("   1. 电调已正确连接到GPIO 13");
  console.log("   2. 电机电源已连接");
  console.log("   3. 螺旋桨已移除");
  console.log("   4. 准备听取电调的蜂鸣声反馈");
  
  const readline = require('readline');
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  
  const answer = await new Promise(resolve => {
    rl.question('\n是否开始校准? (输入 y 确认): ', resolve);
  });
  rl.close();
  
  if (answer.toLowerCase() !== 'y') {
    console.log("   _校准已取消_");
    return false;
  }
  
  // 4. 执行校准步骤
  console.log("\n🚀 开始校准...");
  
  // 步骤1: 最大油门信号
  console.log("步骤1: 发送最大油门信号 (2.0ms)...");
  console.log("   请听电调的蜂鸣声，通常会发出确认音调");
  try {
    await sendPWMSignal(13, 2.0, 5000); // 保持5秒
    console.log("   ✅ 最大油门信号发送完成");
  } catch (error) {
    console.log(`   ❌ 发送失败: ${error.message}`);
    return false;
  }
  
  // 等待用户确认
  console.log("\n   请确认是否听到电调的特殊声音或蜂鸣声变化");
  const answer1 = await new Promise(resolve => {
    const rl2 = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    rl2.question('   是否听到确认声音? (y/N): ', resolve);
    rl2.close();
  });
  
  if (answer1.toLowerCase() !== 'y') {
    console.log("   ⚠️  未听到确认声音，可能需要重新校准");
  }
  
  // 步骤2: 最小油门信号
  console.log("\n步骤2: 发送最小油门信号 (1.0ms)...");
  console.log("   请听电调的蜂鸣声，通常会发出不同的确认音调");
  try {
    await sendPWMSignal(13, 1.0, 5000); // 保持5秒
    console.log("   ✅ 最小油门信号发送完成");
  } catch (error) {
    console.log(`   ❌ 发送失败: ${error.message}`);
    return false;
  }
  
  // 等待用户确认
  console.log("\n   请确认是否听到电调的特殊声音或蜂鸣声变化");
  const answer2 = await new Promise(resolve => {
    const rl3 = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    rl3.question('   是否听到确认声音? (y/N): ', resolve);
    rl3.close();
  });
  
  if (answer2.toLowerCase() !== 'y') {
    console.log("   ⚠️  未听到确认声音，可能需要重新校准");
  }
  
  // 步骤3: 中性信号
  console.log("\n步骤3: 发送中性信号 (1.5ms)...");
  try {
    await sendPWMSignal(13, 1.5, 2000); // 保持2秒
    console.log("   ✅ 中性信号发送完成");
  } catch (error) {
    console.log(`   ❌ 发送失败: ${error.message}`);
    return false;
  }
  
  console.log("\n✅ 电调校准完成!");
  console.log("   现在可以测试控制了");
  
  return true;
}

// 发送PWM信号的辅助函数
async function sendPWMSignal(pin, dutyCycleMs, durationMs) {
  const periodMs = 20; // 50Hz = 20ms周期
  const highTimeMs = dutyCycleMs;
  const lowTimeMs = periodMs - dutyCycleMs;
  
  const cycles = Math.floor(durationMs / periodMs);
  
  for (let i = 0; i < cycles; i++) {
    await execAsync(`gpio -g write ${pin} 1`);
    await sleep(highTimeMs);
    await execAsync(`gpio -g write ${pin} 0`);
    await sleep(lowTimeMs);
  }
}

// 精确延时函数（毫秒）
function sleep(ms) {
  return new Promise(resolve => {
    const start = Date.now();
    while (Date.now() - start < ms) {
      // 空循环等待
    }
    resolve();
  });
}

async function testControlAfterCalibration() {
  console.log("\n🎮 校准后控制测试:");
  
  try {
    // 发送中性信号
    console.log("   发送中性信号...");
    await sendPWMSignal(13, 1.5, 1000);
    
    // 发送前进信号
    console.log("   发送前进信号...");
    await sendPWMSignal(13, 1.7, 3000);
    
    // 回到中性
    console.log("   回到中性信号...");
    await sendPWMSignal(13, 1.5, 1000);
    
    console.log("   ✅ 控制测试完成");
    return true;
  } catch (error) {
    console.log(`   ❌ 控制测试失败: ${error.message}`);
    return false;
  }
}

async function main() {
  console.log("🚀 开始详细电调校准程序");
  
  const calibrated = await calibrateESC();
  
  if (calibrated) {
    console.log("\n🔧 是否进行控制测试?");
    const readline = require('readline');
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    const answer = await new Promise(resolve => {
      rl.question('   进行控制测试? (y/N): ', resolve);
    });
    rl.close();
    
    if (answer.toLowerCase() === 'y') {
      await testControlAfterCalibration();
    }
  }
  
  console.log("\n📋 校准程序结束");
  console.log("\n💡 后续建议:");
  console.log("   1. 如果电调仍然只是响而不转，请检查电源连接");
  console.log("   2. 检查电机是否正常工作");
  console.log("   3. 确认电调与电机的相序连接是否正确");
  console.log("   4. 某些电调可能需要特殊的校准程序，请参考电调说明书");
}

main();